Categorical data

categorical data with pandas
import pandas as pd
df=pd.DataFrame([['green','M',10.1,'class1'], ['red', 'L', 13.5, 'class2'], ['blue', 'XL', 15.3, 'class1']])
df.columns=['color', 'size', 'price', 'classlabel']
df

   color size  price classlabel

0  green    M   10.1     class1

1    red    L   13.5     class2

2   blue   XL   15.3     class1

df는 순서가 없는 특성(color)와 순서가 있는 특성(size), 수치형 특성(price)가 있다.
순서가 있는 특성 매핑
XL=L+1=M+2 라고 size 특성을 올바르게 자동으로 바꾸어 주는 함수를 가정하자.
size_mapping={
'XL':3,
'L':2,
'M':1}
df['size']=df['size'].map(size_mapping)
df

   color  size  price classlabel

0  green     1   10.1     class1

1    red     2   13.5     class2

2   blue     3   15.3     class1

판다스의 map 메서드를 이용하여 이와 동일하게 적용할 수 있다.
inv_size_mapping={v:k for k, v in size_mapping.items()}
df['size'].map(inv_size_mapping)

0     M

1     L

2    XL

Name: size, dtype: object

class label encoding
import numpy as np
class_mapping={label:idx for idx, label in enumerate(np.unique(df['classlabel']))}
class_mapping

{'class1': 0, 'class2': 1}

df['classlabel']=df['classlabel'].map(class_mapping)
df

   color  size  price  classlabel

0  green     1   10.1           0

1    red     2   13.5           1

2   blue     3   15.3           0

다시 되돌리기
inv_class_mapping={v:k for k, v in class_mapping.items()}
df['classlabel']=df['classlabel'].map(inv_class_mapping)
df

   color  size  price classlabel

0  green     1   10.1     class1

1    red     2   13.5     class2

2   blue     3   15.3     class1

sklearn LabelEncoder
from sklearn.preprocessing import LabelEncoder
class_le=LabelEncoder()
y=class_le.fit_transform(df['classlabel'].values)
y

array([0, 1, 0])

다시 되돌리기
class_le.inverse_transform(y)

array(['class1', 'class2', 'class1'], dtype=object)